package com.jrx.anytxn.param.service.system.impl;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.jrx.anytxn.common.data.TxnRespCode;
import com.jrx.anytxn.common.exception.TxnException;
import com.jrx.anytxn.common.uitl.BeanMapping;
import com.jrx.anytxn.common.uitl.StringUtils;
import com.jrx.anytxn.i18n.response.TxnPage;
import com.jrx.anytxn.param.constant.Constant;
import com.jrx.anytxn.param.constant.ErrorMsgConstant;
import com.jrx.anytxn.param.dto.system.SystemParameterReq;
import com.jrx.anytxn.param.dto.system.SystemParameterRes;
import com.jrx.anytxn.param.entity.PrSystemParameter;
import com.jrx.anytxn.param.mapper.ext.ExtSystemParameterMapper;
import com.jrx.anytxn.param.service.system.ISystemParameterService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author by yf
 * @Classname SystemParameterServiceImpl
 * @Description 系统参数接口实现
 * @Date 2019/6/14 0014 上午 10:47
 */
@Service
@CacheConfig(cacheNames = "SYS_PARAMETER")
public class SystemParameterServiceImpl implements ISystemParameterService {
    private static final Logger logger = LoggerFactory.getLogger(SystemParameterServiceImpl.class);

    @Resource
    private ExtSystemParameterMapper extSystemParameterMapper;


    @Override
    public TxnPage<SystemParameterRes> findAllSystemParameter(Integer pageNum, Integer pageSize, String tenantId) throws TxnException {
        Page<PrSystemParameter> page = PageHelper.startPage(pageNum, pageSize,Constant.ORDER_BY_SYS_SORT);
        List<PrSystemParameter> prSystemParameterList = extSystemParameterMapper.selectAllByTenantId(tenantId);
        if (prSystemParameterList.isEmpty()) {
            logger.error("查询系统参数列表为空");
            throw new TxnException(TxnRespCode.NO_DATA.getCode(), TxnRespCode.NO_DATA.getMsg());
        }
        List<SystemParameterRes> res = BeanMapping.copyList(prSystemParameterList, SystemParameterRes.class);
        return new TxnPage<>(pageNum, pageSize, page.getTotal(), res);
    }

    @Cacheable(key = "'sysParameter_'+#tenantId+'_'+#paramCode")
    @Override
    public SystemParameterRes findByParamCode(String paramCode, String tenantId) throws TxnException {
        if (StringUtils.isBlank(paramCode)) {
            logger.error("系统参数ID为空");
            throw new TxnException(TxnRespCode.NOT_EMPTY.getCode(), TxnRespCode.NOT_EMPTY.getMsg(ErrorMsgConstant.NO_SYSTEM_PARAMETER_CODE));
        }
        PrSystemParameter prSystemParameter = extSystemParameterMapper.selectByParamCodeAndTenId(paramCode, tenantId);
        if(prSystemParameter == null){
            return null;
        }
        return BeanMapping.copy(prSystemParameter, SystemParameterRes.class);
    }

    @CacheEvict(key = "'sysParameter_'+#tenantId+'_'+#paramCode")
    @Override
    public Boolean removeSystemParameter(String paramCode, String tenantId) throws TxnException {
        if (StringUtils.isBlank(paramCode)) {
            logger.error("系统参数ID为空");
            throw new TxnException(TxnRespCode.NOT_EMPTY.getCode(), TxnRespCode.NOT_EMPTY.getMsg(ErrorMsgConstant.NO_SYSTEM_PARAMETER_CODE));
        }
        int a = extSystemParameterMapper.deleteByParamCode(paramCode, tenantId);
        return a > 0;
    }

    @CacheEvict(key = "'sysParameter_'+#systemParameterReq.tenantId+'_'+#systemParameterReq.paramCode")
    @Override
    public SystemParameterRes modifySystemParameter(SystemParameterReq systemParameterReq) throws TxnException {
        PrSystemParameter prSystemParameter = BeanMapping.copy(systemParameterReq, PrSystemParameter.class);
        if (StringUtils.isBlank(systemParameterReq.getParamCode())) {
            logger.error("系统参数码不存在");
            throw new TxnException(TxnRespCode.NOT_EMPTY.getMsg());
        }
        /*根据主键ID判断此信息是否存在 ，不存在则抛出异常，否则修改不为空的字段信息*/
        PrSystemParameter systemParameter = extSystemParameterMapper.selectByParamCodeAndTenId(systemParameterReq.getParamCode(), systemParameterReq.getTenantId());
        if (systemParameter == null) {
            logger.error("{}的信息不存在", systemParameterReq.getParamCode());
            throw new TxnException(TxnRespCode.NO_DATA.getCode(), TxnRespCode.NO_DATA.getMsg(ErrorMsgConstant.SYSTEM_PARAMETER_EXISTS));
        }

        extSystemParameterMapper.updateByParamCodeAndTenId(prSystemParameter);
        return BeanMapping.copy(prSystemParameter, SystemParameterRes.class);
    }

    @Override
    public SystemParameterRes addSystemParameter(SystemParameterReq systemParameterReq) throws TxnException {
        /*根据系统代码ID查看是否已存在此信息*/
        PrSystemParameter parameter = extSystemParameterMapper.selectByParamCodeAndTenId(systemParameterReq.getParamCode(), systemParameterReq.getTenantId());
        if (parameter != null) {
            logger.error("此{}的信息已存在", systemParameterReq.getParamCode());
            throw new TxnException(TxnRespCode.DATA_EXISTS.getCode(), TxnRespCode.DATA_EXISTS.getMsg(ErrorMsgConstant.SYSTEM_PARAMETER_EXISTS));
        }
        PrSystemParameter prSystemParameter = BeanMapping.copy(systemParameterReq, PrSystemParameter.class);

        prSystemParameter.setRecordVersionNumber(Constant.VERSION_NUMBER);
        extSystemParameterMapper.insertSelective(prSystemParameter);
        return BeanMapping.copy(prSystemParameter, SystemParameterRes.class);
    }
}
